---
title: 关于代码生成
---

import Tabs from "@theme/Tabs";
import TabItem from "@theme/TabItem";
import CodeBlock from "@theme/CodeBlock";
import fetchUser from "!!raw-loader!./about_codegen/main.dart";
import rawFetchUser from "!!raw-loader!./about_codegen/raw.dart";
import {
  trimSnippet,
  CodeSnippet,
} from "../../../../src/components/CodeSnippet";

代码生成是指使用工具为我们生成代码。   
在Dart中，它的缺点是需要额外的步骤来“编译”应用。
尽管这个问题可能会在不久的将来得到解决，
但Dart团队正在研究并解决这个问题的潜在方案。

在Riverpod的上下文中，代码生成就是稍微改变定义“provider”的语法。打个比方，原本我们这样写：

<CodeBlock language="dart">{trimSnippet(rawFetchUser)}</CodeBlock>

使用代码生成，我们会写：

<CodeBlock language="dart">{trimSnippet(fetchUser)}</CodeBlock>

使用Riverpod时，代码生成是完全可选的。 当然你也完全可以不使用。  
与此同时，Riverpod支持代码生成，且推荐你使用它。

有关如何安装和使用Riverpod的代码生成器的信息，
请参阅[开始上手](./getting_started)页面。确保在文档的侧边栏中启用代码生成。

## 为什么在Riverpod中使用代码生成？

你可能在想：“如果在Riverpod中代码生成是可选的，为什么要使用？”

让你的代码生活更简单。  
这包括但不限于：

- 更好的语法, 更可读且更灵活，而且还能减少学习曲线。
  - 不需要担心`FutureProvider`、`Provider` 还是其他 provider。仅需写下你的逻辑，
    Riverpod将为你选择最合适的provider。
  - 向provider传递参数现在不受限制。不再局限于使用 [family](./concepts/modifiers/family) 和传递单个参数，
    现在可以传递任何形式的参数。这包括命名参数、可选参数甚至默认值。
- 在Riverpod中编写的代码支持 **有状态热重载**。
- 更好地调试，通过生成额外的元数据然后用调试器调试。
- Riverpod的一些功能将只支持代码生成。

与此同时，许多应用程序中已经使用了代码生成比如 [Freezed](https://pub.dev/packages/freezed) 或 [json_serializable](https://pub.dev/packages/json_serializable)。
在这种情况下，你的项目可能已经为代码生成配置好了，使用Riverpod应该很简单。

[hookwidget]: https://pub.dev/documentation/flutter_hooks/latest/flutter_hooks/HookWidget-class.html
[statefulwidget]: https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html
[riverpod]: https://github.com/rrousselgit/riverpod
[hooks_riverpod]: https://pub.dev/packages/hooks_riverpod
[flutter_riverpod]: https://pub.dev/packages/flutter_riverpod
[flutter_hooks]: https://github.com/rrousselGit/flutter_hooks
